-- title: game title
-- author: game developer, email, etc.
-- desc: short description
-- site: website link
-- license: MIT License (change this to your license of choice)
-- version: 0.1
-- script: lua
-- TODO:
-- - Fix warp system, be able to add more warps easier
-- - Princess follow dragon
-- - Enemies, placement, and HP
-- - Bullet damage
-- - Game ending
x=96; y=24 -- Player coordinates
playerspr = 1 -- Player sprite
pvelx=0; pvely=0 -- Player velocity
playerhealth=100 -- Player health
bx=-100; by=-100 -- Bullet coordinates
bvelx=0; bvely=0 -- Bullet velocity
mapx=0; mapy=0 -- Current map location
nowalk = { 72 }
wannamovex=0
wannamovey=0
-- HELPER FUNCTIONS ------------------------------
function IsOnThisMap( obj )
return obj.mapX == mapx and obj.mapY == mapy
end
function GetDistance( x1, y1, x2, y2 )
return math.sqrt( ( x2 - x1 )^2 + ( y2 - y1 )^2 )
end
-- DEBUG -----------------------------------------
function Debug( title, thing, x, y, level )
print( title .. ": " .. type(thing), x + (level*8), y)
if thing == nil then
return
end
for key, value in pairs( thing ) do
y = y + 8
if type( value ) == "table" then
Debug( key, value, x + (level*8), y, level+1 )
else
print( key .. "=" .. value, x + (level*8), y )
end
end
end
function Debug2()
print( "MAP: " .. mapx .. "," .. mapy, 2, 128 )
print( "PLAYER: " .. x .. "," .. y, 50, 128 )
end
-- WARP HANDLER ----------------------------------
warps = {}
warptimer = 0
function CreateWarp( tile1X, tile1Y, tile2X, tile2Y )
newWarp = {}
newWarp.tileX = tile1X
newWarp.tileY = tile1Y
newWarp.mapX = math.floor( newWarp.tileX / 30 ) * 30
newWarp.mapY = math.floor( newWarp.tileY / 16 ) * 16
newWarp.x = (newWarp.tileX - newWarp.mapX)*8
newWarp.y = (newWarp.tileY - newWarp.mapY)*8
newWarp.tileDestX = tile2X
newWarp.tileDestY = tile2Y
newWarp.mapDestX = math.floor( newWarp.tileDestX / 30 ) * 30
newWarp.mapDestY = math.floor( newWarp.tileDestY / 16 ) * 16
newWarp.xDest = (newWarp.tileDestX - newWarp.mapDestX)*8
newWarp.yDest = (newWarp.tileDestY - newWarp.mapDestY)*8
table.insert( warps, newWarp )
end
function HandleWarps()
if warptimer == 0 then
for id, wp in pairs( warps ) do
if IsOnThisMap( wp ) then
if GetDistance( x, y, wp.x, wp.y ) <= 8 then
mapx = wp.mapDestX; mapy = wp.mapDestY
x = wp.xDest; y = wp.yDest
warptimer = 100
end
end -- IsOnMap
end -- for
elseif warptimer > 0 then
warptimer = warptimer - 1
end -- warptimer
end -- function
-- ENEMY HANDLER ---------------------------------
enemies = {}
function CreateEnemy( mapX, mapY, tileX, tileY, health, imgTopLeft, imgTopRight, imgBottomLeft, imgBottomRight )
newEnemy = {}
newEnemy.mapX = mapX
newEnemy.mapY = mapY
newEnemy.tileX = tileX
newEnemy.tileY = tileY
newEnemy.x = (tileX - mapX) * 8
newEnemy.y = (tileY - mapY) * 8
newEnemy.health = health
newEnemy.imgTopLeft = imgTopLeft
newEnemy.imgTopRight = imgTopRight
newEnemy.imgBottomLeft = imgBottomLeft
newEnemy.imgBottomRight = imgBottomRight
table.insert( enemies, newEnemy )
end
function UpdateEnemies()
for id, en in pairs( enemies ) do
if IsOnThisMap( en ) then
-- Enemy behavior
if GetDistance(bx,by,en.x,en.y) <= 8 then
en.x=-200
en.y=-200
end
end
end
end
function DrawEnemies()
for id, en in pairs( enemies ) do
if IsOnThisMap( en ) then
spr( en.imgTopLeft, en.x-4, en.y-4, 0 )
spr( en.imgTopRight, en.x+4, en.y-4, 0 )
spr( en.imgBottomLeft, en.x-4, en.y+4, 0 )
spr( en.imgBottomRight, en.x+4, en.y+4, 0 )
print( en.health, en.x, en.y - 8 )
end
end
end
-- SETUP -----------------------------------------
-- MAPX MAPY TILEX TILEY HEALTH SPR1 SPR2 SPR3 SPR4
CreateEnemy( 60, 0, 86, 11, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 78, 6, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 86, 10, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 73, 11, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 75, 8, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 85, 5, 3, 13, 14, 29, 30 )
CreateEnemy( 60, 0, 76, 14, 3, 13, 14, 29, 30 )
-- TILE1X, TILE1Y, TILE2X, TILE2Y
CreateWarp( 57, 9, 62, 10 )
-- GAME LOOP -------------------------------------
function TIC()
map (mapx,mapy) -- Draw the map
spr (playerspr, x-4,y-4,10) -- Draw the player sprite
spr (playerspr+1, x+4,y-4,10)
spr (playerspr+16,x-4,y+4,10)
spr (playerspr+17,x+4,y+4,10)
print(playerhealth,x,y-8) -- Draw player health
spr (81,bx,by,0) -- Draw the bullet
UpdateEnemies()
DrawEnemies()
HandleWarps()
--Debug( "warps", warps, 0, 0, 0 )
--Debug2()
-- WALKING OFF THE SIDE OF THE SCREEN
if x > 240 then
mapx = mapx + 30
x = 0
elseif x<-8 then
mapx = mapx - 30
x = 240-8
elseif y > 136 then
mapy = mapy + 17
y = 0
elseif y <-8 then
mapy = mapy - 17
y = 136-8
end
-- PLAYER ATTACK
if btn(4) and bx==-100 then
bx=x; by=y
bvelx=pvelx*2; bvely = pvely*2
end
-- BULLET MOVEMENT
if bx ~= -100 then
bx=bx+bvelx
by=by+bvely
end
-- REMOVE BULLET
if bx < -20 or bx > 240 or by < -20 or by > 136
then bx = -100
end
if btn (0) then
wannamovey=y-1
pvelx=0; pvely=-1
elseif btn (1) then
wannamovey=y+1
pvelx=0; pvely=1
elseif btn (2) then
wannamovex=x-1
playerspr = 1
pvelx=-1; pvely=0
elseif btn (3) then
wannamovex=x+1
playerspr = 97
pvelx=1; pvely=0
end
tilehere=mget(mapx + wannamovex/8, mapy + wannamovey/8)
canwalk=true
for id,badtile in pairs(nowalk) do
if tilehere == badtile then
canwalk=false
end
end
if canwalk then
x = wannamovex
y = wannamovey
spr(16,x-4,y-4,0)
end
end
--
-- 001:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4aaaaaa4aaaaa222aaa22022a2
-- 002:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2aaaaaa242aa4a2424aa3a424aaa2a
-- 003:6666666666646666664646666664666666656666666576666665666666666666
-- 004:ccccceee8888cceeaaaa0cee888a0ceeccca0cccccca0c0c0cca0c0c0cca0c0c
-- 005:6666666666666666666666666666666666666666666666666666666666666666
-- 006:6666666666666666666666666666666666666666666666666666666666666666
-- 007:aaaaaaaaaaaaaaaaaaaaaaa2aaaaa222aaa22221aa221212aa221222aa212222
-- 008:aaa22222a2222222222122222122222222222222222222222222222222222222
-- 009:2222222a22222222222222222222222222222222222222222222222222222222
-- 010:aaaaaaaaaaaaaaaa22aaaaaa222aaaaa222aaaaa222aaaaa222222aa2222122a
-- 011:000000040000044400000fff00000ff40000ff4f0000ff4c000fff24000ff442
-- 012:b400000044440000ffff000044ff00004f4ff0004c4ff000442fff002244ff00
-- 013:00000000000000000000066600006666000066ff000066660000665500006666
-- 014:000000000066000066660000666650006ff66000666660005566600065566000
-- 017:a2222222aa222222aaaa2222aaaa2222aaaa2aaaaaaa2aaaaaa2aaa2aaaaaaaa
-- 018:24aaa2aa22aa2aaa2222aaaa222aaaaa2aaaaaaa2aaaaaaaaaaaaaaaaaaaaaaa
-- 019:cacccccccaaaaaaacaaacaaacaaaaccccaaaaaaac8888888cc000cccecccccec
-- 020:ccca00ccaaaa0ccecaaa0ceeaaaa0ceeaaaa0cee8888ccee000cceeecccceeee
-- 021:6666666666666666666666666666656666666656666656656666655566666655
-- 022:6666666666666666666666666566666656666666566566666556666655666666
-- 023:222122222222222222222222aa222222aa2222eeaaeeeeeeaaaaeedeaaaaaede
-- 024:22222222222222222222222222222222eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-- 025:22222222222222222222222222222222e22222eeeeeeeeeeeeedeeeeeeedeeee
-- 026:2222112a2211112a2222222222222222eeeaaaaaeeeaaaaaeeaaaaaaeaaaaaaa
-- 027:000ff044000f0000000004bb000004bb000004bb00000bbb0000bb4400000044
-- 028:4440ff0040000f00bbb40000bbb40000bbb40000bbbb0000044bb00004400000
-- 029:0000666600006666000006660000000500000066000000650000065600000665
-- 030:6666600066660000666000006660000056000000600000000000000000000000
-- 033:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacccaaaaccccaaaccccc
-- 034:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaccaaaaaacccaaaaaccccaaaa
-- 035:6666666666666666666666666666666666666666666666666666666666666666
-- 036:6666666666666666666666666666666666666666666666666666666666666666
-- 037:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-- 038:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-- 039:aaaaadeeaaaaaaeeaaaaaaeeaaaaaaeeaaaaaaedaaaaaaeeaaaaaaeeaaaaaaed
-- 040:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeedeeeeeeedeeeeeee
-- 041:eeddeeeaeeeeeeeaeeeeeeeaeeeeeeeaeeeeeeeaeeeeeeeaeeeeeeeaeeeeeeea
-- 042:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-- 049:aaccccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-- 050:cccccaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-- 051:6666644466664433666643446666434466664433666664446666666666666666
-- 052:4666666644666666346666663466666644666666466666666666666666666666
-- 053:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-- 054:6565656556565656656565655656565665656565565656566565656556565656
-- 055:aaaaaaedaaaaaaeeaaaaaaeeaaaaaaeeaaaaaaeeaaaaaaeeaaaaaaeeaaaaaaee
-- 056:eee33333ee333333ee333333ee333333ee33333fee33333fee333333ee333333
-- 057:3eeeeeea33eeeeea33eeeeea33eeeeeaf3eeeddaf3eeeeda33eeedea33eeedea
-- 058:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
-- 065:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-- 066:9999999999999999999999999999999999999999999999999999999999999999
-- 067:2222222222222222222222222222222222222222222222222222222222222222
-- 068:cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
-- 069:eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee
-- 070:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-- 072:fffffffffffffffffffffffffff3f3ffffff3ffffff3f3ffffffffffffffffff
-- 081:0000000000000000004034400023344000223300002220400202000000000000
-- 082:ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff
-- 083:1111111111111111111111111111111111111111111111111111111111111111
-- 084:dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
-- 085:dddddddddddddddddddddddddddddddddddddddedddddddedddcccceccccccce
-- 086:ddddddddddddddddddddddddddddddddeeedddddeeedddddeeedddddeeeddddd
-- 097:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa2aaa4aa242aa3aa4242a2aaa424
-- 098:aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4aaaaaaaa4aaaaaaa222aaa2a22022a
-- 099:ddddddddddddddddddddddddddd22222ddd22222ddd22222ddd11111ddd11111
-- 100:dddddddddddddddddddddddd2222222211222222112222222222222222222222
-- 101:ccccccceccccccceccccccce2222211e2222211e2221122e2221122e2222222e
-- 102:eeedddddeeedddddeeedddddeeedddddeeedddddeeedddddeeedddddeeeddddd
-- 113:aa2aaa42aaa2aa22aaaa2222aaaaa222aaaaaaa2aaaaaaa2aaaaaaaaaaaaaaaa
-- 114:2222222a222222aa2222aaaa2222aaaaaaa2aaaaaaa2aaaa2aaa2aaaaaaaaaaa
-- 115:dddeeeeedddeeeeedddeeeefdddffeefdddfffffdddfffffdddfffffdddfffff
-- 116:eeeeeeeeeeeeffffffffffffdddddddddddddddddddddddddddddddddddddddd
-- 117:eeeeeeeefeeffeeeffffffffddddddffddddddffddddddffddddddffddddddff
-- 118:eeedddddeeedddddeeedddddffedddddfffdddddfffdddddfffdddddfffddddd
--
--
--
-- 000:00000000ffffffff00000000ffffffff
-- 001:0123456789abcdeffedcba9876543210
-- 002:0123456789abcdef0123456789abcdef
--
--
-- 000:60008000b00da00ca07da00da00ea00fa0c1a002b001a002a001a001a00e900e907e900090018000800f700370e27051800f900ea00ea00d800d000e000000000000
--
--
-- 000:100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
--
--
-- 000:1a1c2c5d275db13e53ef7d57ffcd75a7f07038b76425717929366f3b5dc941a6f673eff7f4f4f494b0c2566c86333c57
--